package com.study.manage.pojo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.annotations.Proxy;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

@Data
@ToString
@Entity
@Table(name = "user")
@Proxy(lazy = false)
public class User implements Serializable {
	private static final long serialVersionUID = -3096736268081409238L;

	/**
	 * JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
	 * TABLE：使用一个特定的数据库表格来保存主键。
	 * SEQUENCE：根据底层数据库的序列来生成主键，条件是数据库支持序列。
	 * IDENTITY：主键由数据库自动生成（主要是自动增长型）
	 * AUTO：主键由程序控制。
	 */
	@Id
	@Column(name="id")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	@Column(name="username",length = 32)
	private String username;
	@Basic
	private String mobile;
	@Basic
	private String email;
	@Basic
	private String password;

	@Basic
	private Integer insertUid;

	@Column(name="insert_time")
	@org.hibernate.annotations.CreationTimestamp
	private Date insertTime;
	@Basic
	@org.hibernate.annotations.UpdateTimestamp
	private Date updateTime;
	@Basic
	private Boolean isDel;
	@Basic
	private Boolean isJob;
	@Basic
	private String mcode;
	@Basic
	private Date sendTime;
	@Basic
	private Integer version;

	@Transient  //实体类字段不映射到数据库
	private String roleNames;

	//@Transient
	//1、关系维护端，负责多对多关系的绑定和解除
	//2、@JoinTable注解的name属性指定关联表的名字，joinColumns指定外键的名字，关联到关系维护端(User)
	//3、inverseJoinColumns指定外键的名字，要关联的关系被维护端(Authority)
	//4、其实可以不使用@JoinTable注解，默认生成的关联表名称为主表表名+下划线+从表表名，
	//即表名为user_authority
	//关联到主表的外键名：主表名+下划线+主表中的主键列名,即user_id
	//关联到从表的外键名：主表中用于关联的属性名+下划线+从表的主键列名,即authority_id
	//主表就是关系维护端对应的表，从表就是关系被维护端对应的表

	//@JsonIgnore
	@ManyToMany(cascade = CascadeType.MERGE,fetch = FetchType.EAGER)
	@JoinTable(name = "user_role",joinColumns = @JoinColumn(name = "user_id"),
			inverseJoinColumns = @JoinColumn(name = "role_id"))
	private List<Role> roles;

}